unit ClsItemPedCompra;

interface

uses Dm, dbtables, biblio, Sysutils, Grids, clsProduto, clsProdutoEntidade, DBClient;

type
  TItemPedCompra = class(tobject)
  private
    Pedc_numero: string;
    Ent_codigo: string;
    pedc_item: string;
  public
    Pro_codigo: string;
    Itpc_quantidade: double;
    Itpc_valorunit: double;
    Itpc_dataped: Tdatetime;
    Itpc_desconto: double;
    Itpc_aliqipi: double;
    Itpc_qtde_pendente: double;
    Itpc_controle: string;
    Itpc_aliqicms: double;
    Itpc_Previsao: TDateTime;
    Itpc_Observacao: string;
    Icms_Codigo: string;
    Itpc_CodTributario: string;

    Itpc_CST_IPI: string;
    Itpc_COD_ENQ: string;
    Itpc_CST_PIS: string;
    Itpc_AliqPIS_P: Double;
    Itpc_QT_BcPIS: Double;
    Itpc_AliqPIS_R: Double;
    Itpc_CST_COFINS: string;
    Itpc_AliqCOFINS_P: Double;
    Itpc_QT_BcCOFINS: Double;
    Itpc_AliqCOFINS_R: Double;
    Hist_Codigo: string;
    Itpc_vProd: Double;
    Itpc_vFrete: Double;
    Itpc_vSeguro: Double;
    Itpc_vOutras: Double;

    function Gravar(p_Pedc_numero, p_Ent_codigo, p_Pedc_item: string): Byte;
    function Recuperar(p_Pedc_numero, p_Ent_codigo, p_Pedc_item: string): Byte;
    function Excluir(p_Pedc_numero, p_Ent_codigo: string): Byte;
    procedure Diminui_Pendente(p_Pedc_numero, p_Ent_codigo, p_Pedc_item, p_Pro_codigo: string; qtde: double);
    procedure Aumenta_Pendente(p_Pedc_numero, p_Ent_codigo, p_Pedc_item, p_Pro_codigo: string; qtde: double);
    procedure Consultar(var p_q: TQuery; p_Pedc_numero, p_Ent_codigo: string);
    function MaiorCodigo(P_pedc_numero, P_ent_codigo: string): integer;
    procedure Juntar_Pedidos(p_Ent_codigo, pedido1, pedido2: string; controla_produto: boolean; var sgItem: TStringGrid); overload;
    procedure Juntar_Pedidos(p_Ent_codigo, pedido1, pedido2: string; controla_produto: boolean; var CDS : TClientDataSet); overload;
    procedure Zerar_Pendencia(p_Pedc_numero, p_Ent_codigo, p_Pedc_item: string; p_qtdePendente: double);
  end;

implementation

uses DB, clsIcmsDiferido, biblio_camp, Biblio_Imp, clsParametros;

var
  parametro : TParametros;
{ TItemPedCompra }

procedure TItemPedCompra.Consultar;
begin
  p_q.sql.Clear;
  p_q.Params.Clear;
  p_q.sql.add('Select * from ItemPedCompra where Pedc_numero=:k_Pedc_numero and Ent_codigo=:k_Ent_codigo order by Pedc_item');
  p_q.parambyname('k_Pedc_numero').asstring := strzero(p_Pedc_numero, 9);
  p_q.parambyname('k_Ent_codigo').asstring := strzero(p_Ent_codigo, 5);
end;

function TItemPedCompra.Excluir;
var
  tq: TQuery;
begin
  tq := Tquery.Create(DmInt);
  tq.databasename := DmInt.Db.databasename;
  tq.active := False;
  tq.sql.Clear;
  tq.params.clear;
  tq.sql.add('DELETE FROM ItemPedCompra WHERE Pedc_numero=:k_Pedc_numero and Ent_codigo=:k_Ent_codigo');
  tq.parambyname('k_Pedc_numero').asstring := strzero(p_Pedc_numero, 9);
  tq.parambyname('k_Ent_codigo').asstring := strzero(p_Ent_codigo, 5);
  GeraLog('ITEMPEDCOMPRA', 'Excluir');
  tq.execSQL;
  Result := 1;
  tq.close;
  tq.Free;
end;

function TItemPedCompra.Gravar;
var
  tq: TQuery;
begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.active := False;
  tq.sql.clear;
  tq.params.clear;
  tq.sql.add('SELECT * FROM ItemPedCompra where Pedc_numero=:k_Pedc_numero and Ent_codigo=:k_Ent_codigo and Pedc_item=:k_Pedc_item');
  tq.parambyname('k_Pedc_numero').asstring := strzero(p_Pedc_numero, 9);
  tq.parambyname('k_Ent_codigo').asstring := strzero(p_Ent_codigo, 5);
  tq.parambyname('k_Pedc_item').asstring := strzero(p_Pedc_item, 2);
  tq.open;
  if tq.eof then begin
    tq.sql.clear;
    tq.params.clear;
    tq.sql.add('INSERT INTO ItemPedCompra(PEDC_NUMERO, ENT_CODIGO, PEDC_ITEM, PRO_CODIGO, ' +
      'ITPC_QUANTIDADE, ITPC_VALORUNIT, ITPC_DATAPED, ITPC_DESCONTO, ITPC_ALIQIPI, ' +
      'ITPC_QTDE_PENDENTE, ITPC_CONTROLE, ITPC_ALIQICMS,Itpc_Previsao,Itpc_Observacao,' +
      'Icms_Codigo, Itpc_CodTributario, Itpc_CST_IPI, Itpc_COD_ENQ, Itpc_CST_PIS, Itpc_AliqPIS_P, Itpc_QT_BcPIS, ' +
      'Itpc_AliqPIS_R, Itpc_CST_COFINS, Itpc_AliqCOFINS_P, Itpc_QT_BcCOFINS, Itpc_AliqCOFINS_R,Itpc_vProd,Itpc_vFrete,Itpc_vSeguro,Itpc_vOutras,Hist_Codigo) ' +
      'VALUES(:k_Pedc_numero,' +
      ':k_Ent_codigo,' +
      ':k_Pedc_item,' +
      ':k_Pro_codigo,' +
      ':k_Itpc_quantidade,' +
      ':k_Itpc_valorunit,' +
      ':k_Itpc_dataped,' +
      ':k_Itpc_desconto,' +
      ':k_Itpc_aliqipi,' +
      ':k_Itpc_qtde_pendente,' +
      ':k_Itpc_controle,' +
      ':k_Itpc_aliqicms,' +
      ':k_Itpc_Previsao,' +
      ':k_Itpc_Observacao,' +
      ':k_Icms_Codigo,' +
      ':k_Itpc_CodTributario,' +
      ':k_Itpc_CST_IPI,' +
      ':k_Itpc_COD_ENQ,' +
      ':k_Itpc_CST_PIS,' +
      ':k_Itpc_AliqPIS_P,' +
      ':k_Itpc_QT_BcPIS,' +
      ':k_Itpc_AliqPIS_R,' +
      ':k_Itpc_CST_COFINS, ' +
      ':k_Itpc_AliqCOFINS_P, ' +
      ':k_Itpc_QT_BcCOFINS, ' +
      ':k_Itpc_AliqCOFINS_R, ' +
      ':k_Itpc_vProd, ' +
      ':k_Itpc_vFrete, ' +
      ':k_Itpc_vSeguro, ' +
      ':k_Itpc_vOutras,');
    if Hist_Codigo <> '' then
      tq.SQL.Add(':k_Hist_Codigo)')
    else
      tq.SQL.Add('null)');
  end else begin
    tq.sql.clear;
    tq.params.clear;
    tq.sql.add('UPDATE ItemPedCompra SET ' +
      'Pro_codigo        =:k_pro_codigo,' +
      'Itpc_quantidade   =:k_Itpc_quantidade,' +
      'Itpc_valorunit    =:k_Itpc_valorunit,' +
      'Itpc_dataped      =:k_Itpc_dataped,' +
      'Itpc_desconto	 =:k_Itpc_desconto,' +
      'Itpc_aliqipi      =:k_Itpc_aliqipi,' +
      'Itpc_qtde_pendente=:k_itpc_qtde_pendente,' +
      'Itpc_controle     =:k_Itpc_controle,' +
      'Itpc_aliqicms     =:k_Itpc_aliqicms,' +
      'Itpc_Previsao     =:k_Itpc_Previsao,' +
      'Itpc_Observacao   =:k_Itpc_Observacao, ' +
      'Icms_Codigo       =:k_Icms_Codigo, ' +
      'Itpc_CodTributario=:k_Itpc_CodTributario, ' +
      'Itpc_CST_IPI      =:k_Itpc_CST_IPI, ' +
      'Itpc_COD_ENQ      =:k_Itpc_COD_ENQ, ' +
      'Itpc_CST_PIS      =:k_Itpc_CST_PIS, ' +
      'Itpc_AliqPIS_P    =:k_Itpc_AliqPIS_P, ' +
      'Itpc_QT_BcPIS     =:k_Itpc_QT_BcPIS, ' +
      'Itpc_AliqPIS_R    =:k_Itpc_AliqPIS_R, ' +
      'Itpc_CST_COFINS   =:k_Itpc_CST_COFINS, ' +
      'Itpc_AliqCOFINS_P =:k_Itpc_AliqCOFINS_P, ' +
      'Itpc_QT_BcCOFINS  =:k_Itpc_QT_BcCOFINS, ' +
      'Itpc_AliqCOFINS_R =:k_Itpc_AliqCOFINS_R, ' +
      'Itpc_vProd        = :k_Itpc_vProd, ' +
      'Itpc_vFrete       = :k_Itpc_vFrete, ' +
      'Itpc_vSeguro      = :k_Itpc_vSeguro, ' +
      'Itpc_vOutras      = :k_Itpc_vOutras');
    if Hist_Codigo <> '' then
      tq.SQL.Add('Hist_Codigo       =:k_Hist_Codigo ')
    else
      tq.SQL.Add('Hist_codigo = null ');
    tq.SQL.Add('WHERE Pedc_numero=:k_Pedc_numero and Ent_codigo=:k_Ent_codigo and Pedc_item=:k_Pedc_item');
  end;
  tq.parambyname('k_Pedc_numero').AsString := StrZero(p_Pedc_numero, 9);
  tq.parambyname('k_Ent_codigo').AsString := StrZero(p_Ent_codigo, 5);
  tq.parambyname('k_Pedc_item').AsString := StrZero(p_Pedc_item, 2);
  tq.parambyname('k_Pro_codigo').asstring := Pro_codigo;
  tq.parambyname('k_Itpc_quantidade').asfloat := Itpc_quantidade;
  tq.parambyname('k_Itpc_valorunit').asfloat := Itpc_valorunit;
  tq.parambyname('k_Itpc_dataped').AsDatetime := Itpc_dataped;
  tq.parambyname('k_Itpc_desconto').asfloat := Itpc_desconto;
  tq.parambyname('k_Itpc_aliqipi').asfloat := Itpc_aliqipi;
  tq.parambyname('K_Itpc_qtde_pendente').asfloat := Itpc_qtde_pendente;
  tq.parambyname('K_Itpc_controle').asstring := Itpc_controle;
  tq.parambyname('k_Itpc_aliqicms').asfloat := Itpc_aliqicms;
  tq.parambyname('k_Itpc_Previsao').asDateTime := Itpc_Previsao;
  tq.parambyname('k_Itpc_Observacao').AsString := Itpc_Observacao;
  tq.parambyname('k_Icms_Codigo').AsString := Icms_Codigo;
  tq.parambyname('k_Itpc_CodTributario').AsString := Itpc_CodTributario;
  tq.ParamByName('k_Itpc_CST_IPI').AsString := Itpc_CST_IPI;
  tq.ParamByName('k_Itpc_COD_ENQ').AsString := Itpc_COD_ENQ;
  tq.ParamByName('k_Itpc_CST_PIS').AsString := Itpc_CST_PIS;
  tq.ParamByName('k_Itpc_AliqPIS_P').AsFloat := Itpc_AliqPIS_P;
  tq.ParamByName('k_Itpc_QT_BcPIS').AsFloat := Itpc_QT_BcPIS;
  tq.ParamByName('k_Itpc_AliqPIS_R').AsFloat := Itpc_AliqPIS_R;
  tq.ParamByName('k_Itpc_CST_COFINS').AsString := Itpc_CST_COFINS;
  tq.ParamByName('k_Itpc_AliqCOFINS_P').AsFloat := Itpc_AliqCOFINS_P;
  tq.ParamByName('k_Itpc_QT_BcCOFINS').AsFloat := Itpc_QT_BcCOFINS;
  tq.ParamByName('k_Itpc_AliqCOFINS_R').AsFloat := Itpc_AliqCOFINS_R;
  tq.ParamByName('k_Itpc_vProd').AsFloat          := Itpc_vProd;
  tq.ParamByName('k_Itpc_vFrete').AsFloat         := Itpc_vFrete;
  tq.ParamByName('k_Itpc_vSeguro').AsFloat        := Itpc_vSeguro;
  tq.ParamByName('k_Itpc_vOutras').AsFloat        := Itpc_vOutras;

  if Hist_Codigo <> '' then
    tq.ParamByName('k_Hist_Codigo').AsString := Hist_Codigo;
  GeraLog('ITEMPEDCOMPRA', 'Gravar');
  tq.ExecSQL;
  Result := 1;
  tq.close;
  tq.Free;
end;

function TItemPedCompra.MaiorCodigo;
var
  tq: TQuery;
begin
  tq := Tquery.Create(DmInt);
  tq.databasename := DmInt.Db.DatabaseName;
  tq.active := False;
  tq.sql.clear;
  tq.sql.add('select max(pedc_item) as maior from itempedcompra where pedc_numero =:K_pedc_numero and ent_codigo =:K_ent_codigo');
  tq.ParamByName('k_pedc_Numero').AsString := P_pedc_numero;
  tq.ParamByName('k_Ent_codigo').AsString := P_ent_codigo;
  tq.Open;
  Result := tq.fieldbyname('maior').AsInteger;
  tq.Close;
  tq.Free;
end;

function TItemPedCompra.Recuperar;
var
  tq: TQuery;
begin
  tq := Tquery.Create(DmInt);
  tq.databasename := DmInt.Db.DatabaseName;
  tq.active := False;
  tq.sql.clear;
  tq.sql.add('SELECT * FROM ItemPedcompra where Pedc_numero=:k_Pedc_numero and Ent_codigo=:k_Ent_codigo and Pedc_item=:k_Pedc_item');
  tq.Params[0].asstring := strzero(p_Pedc_numero, 9);
  tq.params[1].asstring := strzero(p_Ent_codigo, 5);
  tq.params[2].asstring := strzero(p_Pedc_item, 2);
  tq.open;
  Pedc_numero := p_Pedc_numero;
  Ent_codigo := p_Ent_codigo;
  Pedc_item := p_Pedc_item;
  if tq.eof then begin
    Itpc_dataped := date;
    Result := 0;
  end else begin
    Itpc_dataped := tq.fieldbyname('Itpc_dataped').asdatetime;
    Result := 1;
  end;
  Pro_codigo := tq.fieldbyname('Pro_codigo').asstring;
  Itpc_quantidade := tq.fieldbyname('Itpc_quantidade').asfloat;
  Itpc_valorunit := tq.fieldbyname('Itpc_valorunit').asfloat;
  Itpc_desconto := tq.fieldbyname('Itpc_desconto').AsFloat;
  Itpc_aliqipi := tq.fieldbyname('Itpc_aliqipi').asfloat;
  Itpc_aliqicms := tq.fieldbyname('Itpc_aliqicms').asfloat;
  Itpc_Previsao := tq.fieldbyname('Itpc_Previsao').asdatetime;
  Itpc_Observacao := tq.FieldByName('Itpc_Observacao').AsString;
  Itpc_qtde_pendente := tq.fieldbyname('Itpc_qtde_pendente').Asfloat;
  Itpc_controle := tq.fieldbyname('Itpc_controle').AsString;
  Icms_Codigo := tq.fieldbyname('Icms_Codigo').AsString;
  Itpc_CodTributario := tq.fieldbyname('Itpc_CodTributario').AsString;
  Itpc_CST_IPI := tq.FieldByName('Itpc_CST_IPI').AsString;
  Itpc_COD_ENQ := tq.FieldByName('Itpc_COD_ENQ').AsString;
  Itpc_CST_PIS := tq.FieldBYname('Itpc_CST_PIS').AsString;
  Itpc_AliqPIS_P := tq.FieldByName('Itpc_AliqPIS_P').AsFloat;
  Itpc_QT_BcPIS := tq.FieldByName('Itpc_QT_BcPIS').AsFloat;
  Itpc_AliqPIS_R := tq.FieldByName('Itpc_AliqPIS_R').AsFloat;
  Itpc_CST_COFINS := tq.FieldByName('Itpc_CST_COFINS').AsString;
  Itpc_AliqCOFINS_P := tq.FieldByName('Itpc_AliqCOFINS_P').AsFloat;
  Itpc_QT_BcCOFINS := tq.FieldByName('Itpc_QT_BcCOFINS').AsFloat;
  Itpc_AliqCOFINS_R := tq.FieldByName('Itpc_AliqCOFINS_R').AsFloat;
  Hist_Codigo  := tq.FieldByName('Hist_Codigo').AsString;
  Itpc_vProd   := tq.FieldByName('Itpc_vProd').AsFloat;
  Itpc_vFrete  := tq.FieldByName('Itpc_vFrete').AsFloat;
  Itpc_vSeguro := tq.FieldByName('Itpc_vSeguro').AsFloat;
  Itpc_vOutras := tq.FieldByName('Itpc_vOutras').AsFloat;
  tq.Close;
  tq.Free;
end;

procedure TItemPedCompra.Diminui_Pendente;
var
  tq: TQuery;
  pend_ant: double;
begin
  tq := Tquery.Create(dmint);
  tq.databasename := DmInt.Db.DatabaseName;
  tq.active := False;
  tq.sql.clear;
  tq.sql.add('SELECT * FROM ItemPedCompra where Pedc_numero=:k_Pedc_numero and ' +
    'Ent_codigo=:k_Ent_codigo and Pedc_item=:k_Pedc_item and ' +
    'Pro_Codigo=:k_Pro_Codigo');
  tq.parambyname('k_Pedc_numero').asstring := strzero(p_Pedc_numero, 9);
  tq.parambyname('k_Ent_codigo').asstring := strzero(p_Ent_codigo, 5);
  tq.parambyname('k_Pedc_item').asstring := strzero(p_Pedc_item, 2);
  tq.parambyname('k_Pro_Codigo').asstring := p_Pro_Codigo;
  tq.open;
  pend_ant := tq.fieldbyname('Itpc_Qtde_Pendente').asfloat;
  tq.close;
  tq.sql.clear;
  tq.sql.add('Update ItemPedCompra set Itpc_Qtde_Pendente=:k_qtde where ' +
    'Pedc_numero=:k_Pedc_numero and Ent_codigo=:k_Ent_codigo and ' +
    'Pedc_item=:k_Pedc_item and Pro_Codigo=:k_Pro_Codigo');
  if (pend_ant - qtde) <= 0 then
    tq.parambyname('k_qtde').asfloat := 0
  else
    tq.parambyname('k_qtde').asfloat := pend_ant - qtde;
  tq.parambyname('k_Pedc_numero').asstring := strzero(p_Pedc_numero, 9);
  tq.parambyname('k_Ent_codigo').asstring := strzero(p_Ent_codigo, 5);
  tq.parambyname('k_Pedc_item').asstring := strzero(p_Pedc_item, 2);
  tq.parambyname('k_Pro_Codigo').asstring := p_Pro_Codigo;
  GeraLog('ITEMPEDCOMPRA', 'Diminui_Pendente');
  tq.execsql;
  tq.close;
  tq.free;
end;

procedure TItemPedCompra.Aumenta_Pendente;
var
  tq: TQuery;
  pend_ant: double;
begin
  tq := Tquery.Create(dmint);
  tq.databasename := DmInt.Db.DatabaseName;
  tq.active := False;
  tq.sql.clear;
  tq.sql.add('SELECT * FROM ItemPedCompra where Pedc_numero=:k_Pedc_numero and ' +
    'Ent_codigo=:k_Ent_codigo and Pedc_item=:k_Pedc_item and ' +
    'Pro_Codigo=:k_Pro_Codigo');
  tq.parambyname('k_Pedc_numero').asstring := strzero(p_Pedc_numero, 9);
  tq.parambyname('k_Ent_codigo').asstring := strzero(p_Ent_codigo, 5);
  tq.parambyname('k_Pedc_item').asstring := strzero(p_Pedc_item, 2);
  tq.parambyname('k_Pro_Codigo').asstring := p_Pro_Codigo;
  tq.open;
  pend_ant := tq.fieldbyname('Itpc_Qtde_Pendente').asfloat;
  tq.close;
  tq.sql.clear;
  tq.sql.add('Update ItemPedCompra set Itpc_Qtde_Pendente=:k_qtde where ' +
    'Pedc_numero=:k_Pedc_numero and Ent_codigo=:k_Ent_codigo and ' +
    'Pedc_item=:k_Pedc_item and Pro_Codigo=:k_Pro_Codigo');
  tq.parambyname('k_qtde').asfloat := pend_ant + qtde;
  tq.parambyname('k_Pedc_numero').asstring := strzero(p_Pedc_numero, 9);
  tq.parambyname('k_Ent_codigo').asstring := strzero(p_Ent_codigo, 5);
  tq.parambyname('k_Pedc_item').asstring := strzero(p_Pedc_item, 2);
  tq.parambyname('k_Pro_Codigo').asstring := p_Pro_Codigo;
  GeraLog('ITEMPEDCOMPRA', 'Aumenta_Pendente');
  tq.execsql;
  tq.close;
  tq.free;
end;

procedure TItemPedCompra.Juntar_Pedidos(p_Ent_codigo, pedido1, pedido2: string; controla_produto: boolean; var sgItem: TStringGrid);
var
  tq: TQuery;
  i, j, k, l, m, n, o, P : integer;
  prod_entidade: TProdutoEntidade;
  produto: TProduto;
  soma_valor  : array of string;
  soma_Desc   : array of string;
  soma_Prod   : array of string;
  soma_Frete  : array of string;
  soma_Seguro : array of string;
  soma_Outras : array of string;
  achou, achouDesc, achouProd,
  achouFrete, achouSeguro, achouOutras: boolean;

  valor_unit: double;
  valor_Desc   : double;
  valor_Prod   : double;
  valor_Frete  : double;
  valor_Seguro : double;
  valor_Outras : double;

  item: string;
  icmsDiferido: TIcmsDiferido;
begin
  parametro := TParametros.Create;
  parametro.Recuperar('1');
  tq := Tquery.create(dmint);
  tq.databasename := dmint.db.databasename;
  tq.active := False;
  tq.sql.clear;
  tq.params.clear;
  tq.sql.add('Select * from ItemPedCompra where Pedc_numero in (:k_pedido1,:k_pedido2) and ' +
    'Ent_codigo=:k_Ent_codigo order by pedc_item');
  tq.params[0].asstring := strzero(pedido1, 9);
  tq.params[1].asstring := strzero(pedido2, 9);
  tq.params[2].asstring := strzero(p_Ent_Codigo, 5);
  tq.open;
  while not tq.eof do begin
    achou        := false;
    if parametro.Usa_CentralImpostos = 'S' then begin
      achouDesc    := false;
      achouProd    := false;
      achouFrete   := false;
      achouSeguro  := false;
      achouOutras  := false;
      valor_Desc   := tq.fieldbyname('Itpc_Desconto').asfloat;
      valor_Prod   := tq.fieldbyname('ITPC_VPROD').asfloat;
      valor_Frete  := tq.fieldbyname('ITPC_VFRETE').asfloat;
      valor_Seguro := tq.fieldbyname('ITPC_VSEGURO').asfloat;
      valor_Outras := tq.fieldbyname('ITPC_VOUTRAS').asfloat;
    end;
    valor_unit   := tq.fieldbyname('Itpc_valorunit').asfloat;

    item := tq.fieldbyname('Pedc_Item').asstring;
    j := 0;

    for i := 0 to length(soma_valor) - 1 do begin
      if copy(soma_valor[i], 1, 2) = item then begin
        achou := true;
        j := i;
      end;
    end;

    if achou then begin
      soma_valor[j] := item + formata_valor2(formata_string(copy(soma_valor[j], 3, 15)) + valor_unit)
    end else begin
      SetLength(soma_valor, Length(soma_valor) + 1);
      soma_valor[Length(soma_valor) - 1] := item + formata_valor2(valor_unit);
    end;

    if parametro.Usa_CentralImpostos = 'S' then begin
      l := 0;
      for i := 0 to length(soma_Prod) - 1 do begin
        if copy(soma_Prod[i], 1, 2) = item then begin
          achouProd := true;
          l := i;
        end;
      end;

      if achouProd then begin
        soma_Prod[l] := item + formata_valor2(formata_string(copy(soma_Prod[l], 3, 15)) + valor_Prod)
      end else begin
        SetLength(soma_Prod, Length(soma_Prod) + 1);
        soma_Prod[Length(soma_Prod) - 1] := item + formata_valor2(valor_Prod);
      end;

      m := 0;
      for i := 0 to length(soma_Frete) - 1 do begin
        if copy(soma_Frete[i], 1, 2) = item then begin
          achouFrete := true;
          m := i;
        end;
      end;

      if achouFrete then begin
        soma_Frete[m] := item + formata_valor2(formata_string(copy(soma_Frete[m], 3, 15)) + valor_Frete)
      end else begin
        SetLength(soma_Frete, Length(soma_Frete) + 1);
        soma_Frete[Length(soma_Frete) - 1] := item + formata_valor2(valor_Frete);
      end;

      n := 0;
      for i := 0 to length(soma_Seguro) - 1 do begin
        if copy(soma_Seguro[i], 1, 2) = item then begin
          achouSeguro := true;
          n := i;
        end;
      end;

      if achouSeguro then begin
        soma_Seguro[n] := item + formata_valor2(formata_string(copy(soma_Seguro[n], 3, 15)) + valor_Seguro)
      end else begin
        SetLength(soma_Seguro, Length(soma_Seguro) + 1);
        soma_Seguro[Length(soma_Seguro) - 1] := item + formata_valor2(valor_Seguro);
      end;

      o := 0;
      for i := 0 to length(soma_Outras) - 1 do begin
        if copy(soma_Outras[i], 1, 2) = item then begin
          achouOutras := true;
          o := i;
        end;
      end;

      if achouOutras then begin
        soma_Outras[o] := item + formata_valor2(formata_string(copy(soma_Outras[o], 3, 15)) + valor_Outras)
      end else begin
        SetLength(soma_Outras, Length(soma_Outras) + 1);
        soma_Outras[Length(soma_Outras) - 1] := item + formata_valor2(valor_Outras);
      end;

      P := 0;
      for i := 0 to length(soma_Desc) - 1 do begin
        if copy(soma_Desc[i], 1, 2) = item then begin
          achouDesc := true;
          P := i;
        end;
      end;

      if achouDesc then begin
        soma_Desc[P] := item + formata_valor2(formata_string(copy(soma_Desc[P], 3, 15)) + valor_Desc)
      end else begin
        SetLength(soma_Desc, Length(soma_Desc) + 1);
        soma_Desc[Length(soma_Desc) - 1] := item + formata_valor2(valor_Desc);
      end;

    end;


    tq.next;

  end;

  tq.close;
  Consultar(tq, pedido1, p_Ent_Codigo);
  tq.open;
  i := 1;

  icmsDiferido := TIcmsDiferido.Create;
  while not tq.eof do begin
    if i > 1 then begin
      SgItem.rowcount := SgItem.rowcount + 1;
    end;

    SgItem.cells[0, i] := tq.fieldbyname('Pedc_item').asstring;

    if controla_produto then begin
      prod_entidade := TProdutoEntidade.Create;
      if prod_entidade.Recuperar_Prod(p_Ent_codigo, tq.fieldbyname('Pro_codigo').asstring) = 1 then begin
        SgItem.cells[1, i] := prod_entidade.Pre_Codigo_Entidade;
        SgItem.cells[2, i] := prod_entidade.Pre_Descricao;

      end else begin
        produto := TProduto.Create;
        produto.Recuperar(tq.fieldbyname('Pro_codigo').asstring);
        SgItem.cells[1, i] := tq.fieldbyname('Pro_codigo').asstring;
        SgItem.cells[2, i] := produto.Pro_nome;
        produto.free;

      end;

      prod_entidade.free;

    end else begin
      produto := TProduto.Create;
      produto.Recuperar(tq.fieldbyname('Pro_codigo').asstring);
      SgItem.cells[1, i] := tq.fieldbyname('Pro_codigo').asstring;
      SgItem.cells[2, i] := produto.Pro_nome;
      produto.free;

    end;

    SgItem.cells[3, i] := Formata_Qtde2(tq.fieldbyname('Itpc_quantidade').asfloat);
    SgItem.cells[4, i] := copy(soma_valor[i - 1], 3, 15);
    SgItem.cells[5, i] := formata_valor(tq.fieldbyname('Itpc_aliqipi').asfloat);

    SgItem.cells[6, i] := formata_valor5(tq.fieldbyname('Itpc_Desconto').asfloat);

    SgItem.cells[7, i] := Formata_Qtde2(tq.fieldbyname('Itpc_Qtde_Pendente').asfloat);
    SgItem.cells[8, i] := formata_valor(tq.fieldbyname('Itpc_aliqicms').asfloat);
    SgItem.cells[9, i] := tq.fieldbyname('Itpc_Previsao').AsString;
    SgItem.cells[10, i] := tq.fieldbyname('Itpc_Observacao').AsString;


    icmsDiferido.Recuperar(tq.FieldByName('icms_codigo').AsString);
    SgItem.Cells[11, i] := FloatToStrF(icmsDiferido.Icms_Percentual, ffNumber, 15, 2);


    SgItem.cells[12, i] := tq.fieldbyname('Itpc_CodTributario').AsString;
    SgItem.Cells[13, i] := tq.FieldByName('ITPC_CST_IPI').AsString;
    SgItem.Cells[14, i] := tq.FieldByName('ITPC_CST_PIS').AsString;
    SgItem.Cells[15, i] := tq.FieldByName('ITPC_CST_COFINS').AsString;
    SgItem.Cells[16, i] := tq.FieldByName('ITPC_COD_ENQ').AsString;
    if parametro.Usa_CentralImpostos = 'S' then begin

      SgItem.Cells[17, i] := copy(soma_Prod[i - 1], 3, 15);
      SgItem.Cells[18, i] := copy(soma_Frete[i - 1], 3, 15);
      SgItem.Cells[19, i] := copy(soma_Seguro[i - 1], 3, 15);
      SgItem.Cells[20, i] := copy(soma_Outras[i - 1], 3, 15);
      SgItem.cells[6, i] := copy(soma_Desc[i - 1], 3, 15);
    end;

    i := i + 1;
    tq.next;


  end;
  FreeAndNil(icmsDiferido);
  tq.close;
  tq.free;
  parametro.free;
end;

procedure TItemPedCompra.Juntar_Pedidos(p_Ent_codigo, pedido1, pedido2: string; controla_produto: boolean; var CDS : TClientDataSet);
var
  tq: TQuery;
  i, j, k, l, m, n, o, p : integer;
  prod_entidade: TProdutoEntidade;
  produto: TProduto;
  soma_valor  : array of string;
  soma_Desc   : array of string;
  soma_Prod   : array of string;
  soma_Frete  : array of string;
  soma_Seguro : array of string;
  soma_Outras : array of string;
  achou, achouDesc, achouProd,
  achouFrete, achouSeguro, achouOutras: boolean;

  valor_unit: double;
  valor_Desc   : double;
  valor_Prod   : double;
  valor_Frete  : double;
  valor_Seguro : double;
  valor_Outras : double;

  item: string;
  icmsDiferido: TIcmsDiferido;
begin
  parametro := TParametros.Create;
  parametro.Recuperar('1');
  tq := Tquery.create(dmint);
  tq.databasename := dmint.db.databasename;
  tq.active := False;
  tq.sql.clear;
  tq.params.clear;
  tq.sql.add('Select * from ItemPedCompra where Pedc_numero in (:k_pedido1,:k_pedido2) and ' +
    'Ent_codigo=:k_Ent_codigo order by pedc_item');
  tq.params[0].asstring := strzero(pedido1, 9);
  tq.params[1].asstring := strzero(pedido2, 9);
  tq.params[2].asstring := strzero(p_Ent_Codigo, 5);
  tq.open;
  while not tq.eof do begin
    achou        := false;
    if parametro.Usa_CentralImpostos = 'S' then begin
      achouDesc    := false;
      achouProd    := false;
      achouFrete   := false;
      achouSeguro  := false;
      achouOutras  := false;
      valor_unit   := tq.fieldbyname('Itpc_valorunit').asfloat;
      valor_Desc   := tq.fieldbyname('Itpc_Desconto').asfloat;
      valor_Prod   := tq.fieldbyname('ITPC_VPROD').asfloat;
      valor_Frete  := tq.fieldbyname('ITPC_VFRETE').asfloat;
      valor_Seguro := tq.fieldbyname('ITPC_VSEGURO').asfloat;
      valor_Outras := tq.fieldbyname('ITPC_VOUTRAS').asfloat;
    end;

    item := tq.fieldbyname('Pedc_Item').asstring;
    j := 0;

    for i := 0 to length(soma_valor) - 1 do begin
      if copy(soma_valor[i], 1, 2) = item then begin
        achou := true;
        j := i;
      end;
    end;

    if achou then begin
      soma_valor[j] := item + formata_valor2(formata_string(copy(soma_valor[j], 3, 15)) + valor_unit)
    end else begin
      SetLength(soma_valor, Length(soma_valor) + 1);
      soma_valor[Length(soma_valor) - 1] := item + formata_valor2(valor_unit);
    end;

    if parametro.Usa_CentralImpostos = 'S' then begin
      l := 0;
      for i := 0 to length(soma_Prod) - 1 do begin
        if copy(soma_Prod[i], 1, 2) = item then begin
          achouProd := true;
          l := i;
        end;
      end;

      if achouProd then begin
        soma_Prod[l] := item + formata_valor2(formata_string(copy(soma_Prod[l], 3, 15)) + valor_Prod)
      end else begin
        SetLength(soma_Prod, Length(soma_Prod) + 1);
        soma_Prod[Length(soma_Prod) - 1] := item + formata_valor2(valor_Prod);
      end;

      m := 0;
      for i := 0 to length(soma_Frete) - 1 do begin
        if copy(soma_Frete[i], 1, 2) = item then begin
          achouFrete := true;
          m := i;
        end;
      end;

      if achouFrete then begin
        soma_Frete[m] := item + formata_valor2(formata_string(copy(soma_Frete[m], 3, 15)) + valor_Frete)
      end else begin
        SetLength(soma_Frete, Length(soma_Frete) + 1);
        soma_Frete[Length(soma_Frete) - 1] := item + formata_valor2(valor_Frete);
      end;

      n := 0;
      for i := 0 to length(soma_Seguro) - 1 do begin
        if copy(soma_Seguro[i], 1, 2) = item then begin
          achouSeguro := true;
          n := i;
        end;
      end;

      if achouSeguro then begin
        soma_Seguro[n] := item + formata_valor2(formata_string(copy(soma_Seguro[n], 3, 15)) + valor_Seguro)
      end else begin
        SetLength(soma_Seguro, Length(soma_Seguro) + 1);
        soma_Seguro[Length(soma_Seguro) - 1] := item + formata_valor2(valor_Seguro);
      end;

      o := 0;
      for i := 0 to length(soma_Outras) - 1 do begin
        if copy(soma_Outras[i], 1, 2) = item then begin
          achouOutras := true;
          o := i;
        end;
      end;

      if achouOutras then begin
        soma_Outras[o] := item + formata_valor2(formata_string(copy(soma_Outras[o], 3, 15)) + valor_Outras)
      end else begin
        SetLength(soma_Outras, Length(soma_Outras) + 1);
        soma_Outras[Length(soma_Outras) - 1] := item + formata_valor2(valor_Outras);
      end;

      p := 0;
      for i := 0 to length(soma_Desc) - 1 do begin
        if copy(soma_Desc[i], 1, 2) = item then begin
          achouDesc := true;
          p := i;
        end;
      end;

      if achouDesc then begin
        soma_Desc[p] := item + formata_valor2(formata_string(copy(soma_Desc[p], 3, 15)) + valor_Desc)
      end else begin
        SetLength(soma_Desc, Length(soma_Desc) + 1);
        soma_Desc[Length(soma_Desc) - 1] := item + formata_valor2(valor_Desc);
      end;
    end;
    tq.next;

  end;

  tq.close;
  Consultar(tq, pedido1, p_Ent_Codigo);
  tq.open;
  i := 1;
  if parametro.Usa_CentralImpostos = 'S' then begin
    CDS.Close;
    CDS.CreateDataset;
    CDS.Open;
  end;
  icmsDiferido := TIcmsDiferido.Create;
  while not tq.eof do begin

    if parametro.Usa_CentralImpostos = 'S' then begin
      CDS.Append;
      CDS.FieldByName('Pedc_item').AsString          := tq.FieldByName('Pedc_item').asstring;

      if controla_produto then begin
        prod_entidade := TProdutoEntidade.Create;
        if prod_entidade.Recuperar_Prod(p_Ent_codigo, tq.fieldbyname('Pro_codigo').asstring) = 1 then begin
          CDS.FieldByName('PRO_CODIGO').AsString       := prod_entidade.Pre_codigo_entidade;
          CDS.FieldByName('Pro_Nome').AsString         := prod_entidade.Pre_Descricao;

        end else begin
          produto := TProduto.Create;
          produto.Recuperar(tq.fieldbyname('Pro_codigo').asstring);
          CDS.FieldByName('PRO_CODIGO').AsString       := tq.FieldByName('Pro_codigo').asstring;
          CDS.FieldByName('Pro_Nome').AsString         := Produto.Pro_nome;
          produto.free;

        end;

        prod_entidade.free;

      end else begin
        produto := TProduto.Create;
        produto.Recuperar(tq.fieldbyname('Pro_codigo').asstring);
        CDS.FieldByName('PRO_CODIGO').AsString       := tq.FieldByName('Pro_codigo').asstring;
        CDS.FieldByName('Pro_Nome').AsString         := Produto.Pro_nome;
        produto.free;

      end;
      CDS.FieldByName('ITPC_QUANTIDADE').AsFloat     := tq.FieldByName('Itpc_quantidade').AsFloat;
      CDS.FieldByName('ITPC_VALORUNIT').AsString     := StringReplace(trim(copy(soma_valor[i - 1], 3, 15)),'.',',',[rfReplaceAll]);
      CDS.FieldByName('ITPC_ALIQIPI').AsFloat        := tq.FieldByName('Itpc_aliqipi').AsFloat;
      CDS.FieldByName('ITPC_DESCONTO').AsString      := StringReplace(trim(copy(soma_Desc[i - 1], 3, 15)),'.',',',[rfReplaceAll]); // tq.FieldByName('Itpc_Desconto').AsFloat;
      CDS.FieldByName('ITPC_QTDE_PENDENTE').AsFloat  := tq.FieldByName('Itpc_Qtde_Pendente').AsFloat;
      CDS.FieldByName('ITPC_ALIQICMS').AsFloat       := tq.FieldByName('Itpc_aliqicms').AsFloat;
      CDS.FieldByName('ITPC_OBSERVACAO').AsString    := tq.FieldByName('Itpc_Observacao').AsString;
      icmsDiferido.Recuperar(tq.FieldByName('icms_codigo').AsString);
      CDS.FieldByName('AliqDiferimento').AsFloat     := icmsDiferido.Icms_Percentual;
      CDS.FieldByName('ITPC_CODTRIBUTARIO').AsString := tq.FieldByName('Itpc_CodTributario').AsString;

      CDS.FieldByName('ITPC_VPROD').AsString         := StringReplace(trim(copy(soma_Prod[i - 1], 3, 15)),'.',',',[rfReplaceAll]);
      CDS.FieldByName('ITPC_VFRETE').AsString        := StringReplace(trim(copy(soma_Frete[i - 1], 3, 15)),'.',',',[rfReplaceAll]);
      CDS.FieldByName('ITPC_SEGURO').AsString        := StringReplace(trim(copy(soma_Seguro[i - 1], 3, 15)),'.',',',[rfReplaceAll]);
      CDS.FieldByName('ITPC_VOUTRAS').AsString       := StringReplace(trim(copy(soma_Outras[i - 1], 3, 15)),'.',',',[rfReplaceAll]);
      CDS.Post;
    end;

    i := i + 1;
    tq.next;


  end;
  FreeAndNil(icmsDiferido);
  tq.close;
  tq.free;
  parametro.free;
end;

procedure TItemPedCompra.Zerar_Pendencia;
var
  tq: Tquery;
begin
  tq := Tquery.Create(DmInt);
  tq.DatabaseName := DmInt.Db.DatabaseName;
  tq.active := False;
  tq.sql.clear;
  tq.params.clear;
  tq.Sql.Add('UPDATE ItemPedCompra SET ' +
    'ITPC_QTDE_PENDENTE=:k_itpc_qtde_pendente ' +
    'WHERE (Pedc_numero=:k_Pedc_numero) and (Ent_codigo=:k_Ent_codigo) and (Pedc_item=:k_Pedc_item)');
  tq.parambyname('k_Pedc_numero').AsString := StrZero(p_Pedc_numero, 9);
  tq.parambyname('k_Ent_codigo').AsString := StrZero(p_Ent_codigo, 5);
  tq.parambyname('k_Pedc_item').AsString := StrZero(p_Pedc_item, 2);
  tq.parambyname('k_itpc_qtde_pendente').AsFloat := p_qtdePendente;
  GeraLog('ITEMPEDCOMPRA', 'Zera_Pendencia');
  tq.ExecSql;
  tq.close;
  tq.free;
end;

end.
